<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>
<script>
    console.log(
        '%c %c\n%c测试%cMr.James', `
  `, `
  `, `
  color: #f3f3f4;
  padding: 4px 3px 4px 11px;
  background-color: #FF3D45;
  border-radius: 5px 0 0 5px;
  `, `
  color: #5A94C1;
  padding: 4px 11px 4px 3px;
  background-color: #bfd3de;
  border-radius: 0 5px 5px 0;
`)

    /*
    一、原型
    1、每个实例对象都有一个prototype属性，被称为显示原型
    2、每个实例对象都有一个proto属性，被称为隐式原型
    3、每个实例对象的隐式原型proto属性指向自身构造函数的显示原型prototype
    4、每个prototype原型上都有constructor属性指向它关联的构造函数
    二、原型链
    获取对象属性时，如果对象没有这个属性,就去原型的proto上面去找,如果找不到就去原型的原型找
    直到找到object.prototype最顶层为止，object.prototype对象也有proto属性，值为null
    */
    function Fun() {//创建一个Fun的函数 （function 生成且作为构造函数）

    }
    var fn = new Fun()//创建一个fn函数 （这个函数由构造函数Fun生成）

    console.log(fn.__proto__ === Fun.prototype);//结果为true,fn的proto指向其构造函数Fun的prototype
    console.log(Fun.__proto__ === Function.prototype);//true,Fun的proto指向其构造函数的Function的prototype
    console.log(Function.__proto__ === Function.prototype);//Function的proto指向其构造函数Function的prototype
    // 构造函数自身是一个函数，他是被自身构造的
    console.log(Function.prototype.__proto__ === Object.prototype);//true,Function.prototype的proto指向其构造函数的prototype
    console.log(Fun.prototype.__proto__ === Object.prototype);//true,所有构造函数的prototype方法的proto都指向object.prototype(除了object.prototype)
    console.log(Object.__proto__ === Function.prototype);//true,Object作为一个构造函数（是一个函数对象）所以它的proto指向Function.prototype
    console.log(Object.prototype.__proto__ == null);//true Object.prototype作为顶级它的proto属性值为null
</script>